/**
 * 短信监听服务模块
 * 用于在 App 环境中自动监听和提取快递短信中的取件码
 */

import packageManager from './package-manager.js'

class SmsListener {
  constructor() {
    this.isListening = false
    this.smsReceiver = null
  }

  /**
   * 检查是否已授权短信读取权限
   * @returns {Promise<boolean>}
   */
  async checkPermission() {
    return new Promise((resolve) => {
      // #ifdef APP-PLUS
      try {
        const smsPermissionGranted = uni.getStorageSync('sms_permission_granted')
        if (smsPermissionGranted === 'true') {
          resolve(true)
          return
        }

        // 检查系统权限
        try {
          const main = plus.android.runtimeMainActivity()
          const PackageManager = plus.android.importClass('android.content.pm.PackageManager')
          const permissionList = [
            'android.permission.READ_SMS',
            'android.permission.RECEIVE_SMS'
          ]

          let allGranted = true
          for (const permission of permissionList) {
            const status = main.checkSelfPermission(permission)
            if (status !== PackageManager.PERMISSION_GRANTED) {
              allGranted = false
              break
            }
          }

          if (allGranted) {
            uni.setStorageSync('sms_permission_granted', 'true')
            resolve(true)
            return
          }

          // 如果没有权限，请求权限
          plus.android.requestPermissions(
            permissionList,
            (resultObj) => {
              const grantedList = Array.isArray(resultObj.granted) ? resultObj.granted : []
              const granted = grantedList.length > 0 && grantedList.some(p => permissionList.includes(p))
              if (granted) {
                uni.setStorageSync('sms_permission_granted', 'true')
              }
              resolve(granted)
            },
            (error) => {
              console.error('检查短信权限失败:', error)
              resolve(false)
            }
          )
        } catch (error) {
          console.error('检查权限异常:', error)
          resolve(false)
        }
      } catch (error) {
        console.error('检查权限异常:', error)
        resolve(false)
      }
      // #endif

      // #ifndef APP-PLUS
      resolve(false)
      // #endif
    })
  }

  /**
   * 从短信文本中提取取件码和驿站信息
   * @param {string} smsBody - 短信内容
   * @returns {object|null} 提取的信息 {pickupCode, location}
   */
  extractPackageInfo(smsBody) {
    if (!smsBody) return null

    console.log('正在分析短信:', smsBody)

    // 提取取件码的多种正则模式（按优先级排序，更宽松的匹配）
    // 支持格式：菜鸟、丰巢、中通、圆通、申通、韵达、顺丰、京东、兔喜、多多等
    const codePatterns = [
      // 1. "凭取件码"后面直接跟数字（丰巢格式：凭取件码06477749）
      /凭(?:取件码|取货码|提货码)\s*([A-Za-z0-9]{3,12})/i,
      
      // 2. "取件码为"格式（如：取件码为2383）
      /(?:取件码|取货码|提货码)为\s*([A-Za-z0-9-]{3,12})/i,
      
      // 3. "取件码："或"取件码:"后面跟数字（常见格式：取件码：123456）
      /(?:取件码|取货码|提货码|验证码|код)[：:]\s*([A-Za-z0-9-]{3,12})/i,
      
      // 4. "取货码"后面直接跟连字符格式（如：取货码11-111）
      /(?:取货码|取件码|提货码)([A-Za-z0-9]{1,4}-[A-Za-z0-9]{2,8})/i,
      
      // 5. "取件码"后面直接跟数字（无冒号，如：取件码123456）
      /(?:取件码|取货码|提货码)\s+([A-Za-z0-9]{3,12})/i,
      
      // 6. "取件码"后面直接跟数字（无空格，如：取件码123456）
      /(?:取件码|取货码|提货码)([A-Za-z0-9]{3,12})/i,
      
      // 7. "请凭取件码"格式（如：请凭取件码123456前往）
      /请凭(?:取件码|取货码|提货码)\s*([A-Za-z0-9]{3,12})/i,
      
      // 8. 带连字符的格式（三段：如：12-34-5678、A1-B2-C345）
      /([A-Za-z0-9]{1,3}-[A-Za-z0-9]{1,3}-[A-Za-z0-9]{3,8})/,
      
      // 9. 带连字符的格式（两段：如：11-111、A1-B234，独立匹配）
      /(?:^|[^A-Za-z0-9])([A-Za-z0-9]{1,4}-[A-Za-z0-9]{2,8})(?:[，,。.\s]|$)/,
      
      // 10. 英文code格式（如：code: 123456 或 CODE：ABC123）
      /(?:code|CODE)[：:\s]*([A-Za-z0-9-]{3,12})/i,
      
      // 11. 柜号/箱号格式（如：柜号：1234、箱号：A123）
      /(?:柜号|箱号|格口号)[：:]\s*([A-Za-z0-9-]{3,12})/i,
      
      // 12. "验证码"格式（某些快递使用：验证码123456）
      /验证码\s*([A-Za-z0-9]{3,12})/i,
      
      // 13. "提取码"格式（如：提取码：123456）
      /提取码[：:]\s*([A-Za-z0-9-]{3,12})/i,
      
      // 14. 纯数字取件码（3-12位，在快递相关上下文中，更宽松）
      // 匹配：取件码、取货码、提货码等关键词后的纯数字
      /(?:取件|取货|提货|验证)[码号]\s*(\d{3,12})/i,
      
      // 15. 在"前往"、"至"、"为"等词前的数字（如：取件码123456前往XX）
      /(?:取件码|取货码)\s*(\d{3,12})\s*(?:前往|至|到|为)/i,
      
      // 16. 方括号内的取件码（如：【取件码】123456）
      /【(?:取件码|取货码)】\s*([A-Za-z0-9]{3,12})/i,
      
      // 17. 宽松匹配：在"取件码"关键词附近3-12位数字或字母数字组合
      /(?:取件码|取货码|提货码)[，,。:：为\s]*([A-Za-z0-9]{3,12})(?:[，,。\s]|地址|$)/i
    ]

    let pickupCode = null
    for (let i = 0; i < codePatterns.length; i++) {
      const pattern = codePatterns[i]
      const match = smsBody.match(pattern)
      if (match && match[1]) {
        pickupCode = match[1].trim()
        console.log(`使用模式 ${i + 1} 识别到取件码:`, pickupCode)
        break
      }
    }

    if (!pickupCode) {
      console.log('未识别到取件码，尝试的短信内容:', smsBody)
      return null
    }

    // 提取快递公司信息
    let expressCompany = null
    const expressCompanyKeywords = {
      '中通快递': ['中通', '中通快递', '中通速递'],
      '圆通快递': ['圆通', '圆通速递', '圆通快递'],
      '申通快递': ['申通', '申通快递', '申通速递'],
      '韵达快递': ['韵达', '韵达快递', '韵达速递'],
      '顺丰快递': ['顺丰', '顺丰速运', '顺丰快递'],
      '京东物流': ['京东', '京东物流', '京东快递'],
      '百世快递': ['百世', '百世快递', '百世汇通'],
      '德邦快递': ['德邦', '德邦快递', '德邦物流'],
      '极兔速递': ['极兔', '极兔速递', 'J&T']
    }

    // 按优先级匹配快递公司（更具体的优先）
    const sortedExpressCompanies = Object.entries(expressCompanyKeywords).sort((a, b) => {
      return b[1].length - a[1].length
    })

    for (const [company, keywords] of sortedExpressCompanies) {
      if (keywords.some(keyword => smsBody.includes(keyword))) {
        expressCompany = company
        console.log(`识别到快递公司: ${expressCompany} (关键词: ${keywords.find(k => smsBody.includes(k))})`)
        break
      }
    }

    // 提取驿站位置信息（支持更多快递公司和驿站）
    let location = '其他驿站' // 默认位置
    const locationKeywords = {
      // 菜鸟系列
      '菜鸟驿站': ['菜鸟', '菜鸟驿站', '菜鸟裹裹'],
      
      // 丰巢系列
      '丰巢快递柜': ['丰巢', '丰巢快递柜', '丰巢柜', '丰巢智能柜'],
      
      // 其他驿站
      '妈妈驿站': ['妈妈驿站', '妈妈'],
      '兔喜生活': ['兔喜', '兔喜生活', '兔喜驿站'],
      '多多驿站': ['多多', '多多驿站', '拼多多'],
      '公司前台': ['公司', '前台', '公司前台'],
      '代收点': ['代收点', '代收', '代收站'],
      '快递柜': ['快递柜', '智能柜', '自提柜'],
      '便利店': ['便利店', '超市', '小卖部']
    }

    // 按优先级匹配驿站位置（更具体的优先）
    const sortedLocations = Object.entries(locationKeywords).sort((a, b) => {
      // 优先匹配更具体的关键词（关键词多的优先）
      return b[1].length - a[1].length
    })

    for (const [loc, keywords] of sortedLocations) {
      if (keywords.some(keyword => smsBody.includes(keyword))) {
        location = loc
        console.log(`识别到驿站位置: ${location} (关键词: ${keywords.find(k => smsBody.includes(k))})`)
        break
      }
    }

    // 提取地址信息（可选，用于参考）
    let address = null
    // 尝试提取地址信息（在"地址"关键词后）
    const addressMatch = smsBody.match(/(?:地址|位置|地点)[：:]\s*([^，,。.\n]{5,50})/i)
    if (addressMatch && addressMatch[1]) {
      address = addressMatch[1].trim()
      console.log('识别到地址信息:', address)
    }

    console.log('提取成功:', { pickupCode, expressCompany, location, address })
    return { pickupCode, expressCompany, location, address }
  }

  /**
   * 启动短信监听服务
   */
  async startListening() {
    // #ifdef APP-PLUS
    try {
      const hasPermission = await this.checkPermission()
      if (!hasPermission) {
        console.log('未授权短信读取权限，无法启动监听')
        return false
      }

      if (this.isListening) {
        console.log('短信监听服务已在运行')
        return true
      }

      // 使用 plus.android 监听短信
      const main = plus.android.runtimeMainActivity()
      const Context = plus.android.importClass('android.content.Context')
      const IntentFilter = plus.android.importClass('android.content.IntentFilter')
      const BroadcastReceiver = plus.android.importClass('android.content.BroadcastReceiver')

      // 创建短信接收器
      this.smsReceiver = plus.android.implements('android.content.BroadcastReceiver', {
        onReceive: (context, intent) => {
          try {
            const bundle = intent.getExtras()
            if (bundle) {
              const pdus = bundle.get('pdus')
              if (pdus) {
                const messages = []
                for (let i = 0; i < pdus.length; i++) {
                  const SmsMessage = plus.android.importClass('android.telephony.SmsMessage')
                  const message = SmsMessage.createFromPdu(pdus[i])
                  const smsBody = message.getMessageBody()
                  messages.push(smsBody)
                }

                const fullMessage = messages.join('')
                this.handleIncomingSms(fullMessage)
              }
            }
          } catch (error) {
            console.error('处理短信失败:', error)
          }
        }
      })

      // 注册接收器
      const filter = new IntentFilter()
      filter.addAction('android.provider.Telephony.SMS_RECEIVED')
      main.registerReceiver(this.smsReceiver, filter)

      this.isListening = true
      console.log('短信监听服务已启动')
      return true
    } catch (error) {
      console.error('启动短信监听失败:', error)
      return false
    }
    // #endif

    // #ifndef APP-PLUS
    console.log('短信监听仅在 App 环境中可用')
    return false
    // #endif
  }

  /**
   * 处理接收到的短信
   * @param {string} smsBody - 短信内容
   */
  handleIncomingSms(smsBody) {
    console.log('收到新短信:', smsBody)

    // 检查是否是快递短信（包含关键词）
    const expressKeywords = ['取件码', '快递', '驿站', '丰巢', '菜鸟', '取货', '提货']
    const isExpressSms = expressKeywords.some(keyword => smsBody.includes(keyword))

    if (!isExpressSms) {
      console.log('不是快递短信，忽略')
      return
    }

    // 提取包裹信息
    const packageInfo = this.extractPackageInfo(smsBody)
    if (!packageInfo) {
      console.log('无法从短信中提取包裹信息')
      return
    }

    // 检查是否已存在相同取件码
    const existingPackages = packageManager.getPackageList()
    const isDuplicate = existingPackages.some(pkg => pkg.pickupCode === packageInfo.pickupCode)

    if (isDuplicate) {
      console.log('包裹已存在，跳过添加')
      return
    }

    // 自动添加包裹
    try {
      packageManager.addPackage(packageInfo)
      console.log('自动添加包裹成功:', packageInfo)

      // 发送通知
      this.showNotification(packageInfo)
    } catch (error) {
      console.error('自动添加包裹失败:', error)
    }
  }

  /**
   * 显示新包裹通知
   * @param {object} packageInfo - 包裹信息
   */
  showNotification(packageInfo) {
    // 显示简短的toast提示，避免截断
    uni.showToast({
      title: `包裹已添加: ${packageInfo.pickupCode}`,
      icon: 'success',
      duration: 2000
    })

    // 使用uni.showModal显示更详细的信息，确保完整显示
    setTimeout(() => {
      uni.showModal({
        title: '包裹管理',
        content: `已自动添加新包裹\n取件码: ${packageInfo.pickupCode}\n${packageInfo.expressCompany ? `快递公司: ${packageInfo.expressCompany}\n` : ''}位置: ${packageInfo.location}`,
        showCancel: false,
        confirmText: '知道了'
      })
    }, 2100) // 等待toast消失后显示modal

    // #ifdef APP-PLUS
    // 可以使用 plus.push 发送本地通知
    try {
      plus.push.createMessage(
        `新快递到了！取件码: ${packageInfo.pickupCode}`,
        JSON.stringify(packageInfo),
        {
          title: '包裹管理',
          cover: false
        }
      )
    } catch (error) {
      console.error('发送通知失败:', error)
    }
    // #endif
  }

  /**
   * 停止短信监听服务
   */
  stopListening() {
    // #ifdef APP-PLUS
    try {
      if (this.smsReceiver) {
        const main = plus.android.runtimeMainActivity()
        main.unregisterReceiver(this.smsReceiver)
        this.smsReceiver = null
        this.isListening = false
        console.log('短信监听服务已停止')
        return true
      }
    } catch (error) {
      console.error('停止短信监听失败:', error)
      return false
    }
    // #endif

    return false
  }

  /**
   * 获取监听状态
   * @returns {boolean}
   */
  getListeningStatus() {
    return this.isListening
  }
}

// 导出单例
const smsListener = new SmsListener()
export default smsListener
